package cminus;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTree;
import javax.swing.tree.TreePath;


public class TreeCreator {
	
	/**
	 * 在指定工作空间内创建一棵树
	 * @param workSpace
	 * @return
	 */
	public JTree createTree(EditorFrame editorFrame)
	{
		File spaceFolder = editorFrame.getWorkSpace().getFolder();	//获取workSpace中的工作空间目录
		TreeNode root = new TreeNode(spaceFolder,true);	//创建树的根节点，类型为TreeNode，根节点对应的文件为工作空间目录
		Tree treeModel = new Tree(root);	//以根节点建立一棵树模型
		JTree tree = new JTree(treeModel);  //创建树对象
		//获取工作区间下面所有的目录（即与projectName.project相对应的目录），也就是项目目录。
		List<File> projectFolders = getProjectFolders(spaceFolder);
		for(File file : projectFolders)
		{
			TreeNode node = createNode(file);
			root.add(node);
		}
		TreePath path = new TreePath(root);	 //创建根在项目树中的路径	
		tree.expandPath(path);				//让树默认展开根节点
		tree.setRootVisible(false);			//设置树的根节点不可见
		return tree;
	}
	
	/**
	 * 获取工作区内的所有的项目名称
	 * @param spaceFolder
	 * @return
	 */
	private List<String> getProjectNames(File spaceFolder)
	{
		List<String> result = new ArrayList<String>();
		for(File file : spaceFolder.listFiles())	//遍历工作空间目录下的所有文件
		{
			if(file.getName().endsWith(".project"))   //将以.project结尾的文件名添加到result中
			{
				result.add(file.getName().substring(0, file.getName().indexOf(".project")));
			}
		}
		return result;
	}
	
	/**
	 * 获取某一个目录下的所有直接节点
	 * @param spaceFolder
	 * @return
	 */
	private List<TreeNode> createNodes(File folder)
	{
		File[] files = folder.listFiles();
		List<TreeNode> result = new ArrayList<TreeNode>();
		for(File file:files)
		{
			if(file.isDirectory())	//将所有的直接目录添加到result中
			{
				result.add(new TreeNode(file,true));
			}
		}
		for(File file:files)		//将所有的直接文件添加到result中
		{
			if(!file.isDirectory())
			{
				result.add(new TreeNode(file,false));
			}
		}
		System.out.println(result.size());
		return result;
	}
	
	/**
	 * 获取工作区间目录下的项目目录
	 * @param spaceFolder
	 * @return
	 */
	private List<File> getProjectFolders(File spaceFolder)
	{
		List<String> projectNames = getProjectNames(spaceFolder);
		List<File> result = new ArrayList<File>();
		for(String projectName : projectNames)
		{
			for(File file:spaceFolder.listFiles())
			{
				if(file.isDirectory())
				{
					if(projectName.equals(file.getName()))
					{
						result.add(file);
					}
				}
			}
		}
		return result;
	}
	
	/**
	 * 创建一个树节点，如果是一目录，创建该目录下所有的孩子节点。
	 * @param folder
	 * @return
	 */
	public TreeNode createNode(File folder)
	{
		TreeNode treeNode = null;
		if(!folder.isDirectory())	//如果只是一个文件，则只创建一个不包含孩子节点的节点
		{
			return new TreeNode(folder,false);
		}
		else						//如果是一目录，则创建一个允许有孩子节点的节点，并且将其目录下的所有文件都创建成其孩子节点
		{
			treeNode = new TreeNode(folder,true);

			List<TreeNode> nodes = createNodes(treeNode.getFile());
			
			for(TreeNode node : nodes)
			{
				treeNode.add(createNode(node.getFile()));	//递归调用
			}
		}
		return treeNode;
	}
}
